

import java.io.ObjectInputStream.GetField;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Scanner;

import org.apache.torque.NoRowsException;
import org.apache.torque.TooManyRowsException;
import org.apache.torque.Torque;
import org.apache.torque.TorqueException;
import org.apache.torque.util.Criteria;

import torque.generated.*;

public class menuTroll {
	public final static String TORQUE_PROPS = new String("torque-3.3//Torque.properties");

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		try {
			Torque.init(TORQUE_PROPS);
			int choix;
			/*			*/
			/* Initializing Torque */
			do{
				Partie p = new Partie();
				System.out.println("---------------------------------------------------------------");
				System.out.println("------------------Jeu de Trolls--------------------------------");
				System.out.println("---------------------------------------------------------------");
				System.out.println("------------------MENU-----------------------------------------");
				System.out.println("--------1. Nouvelle Partie-------------------------------------");
				System.out.println("--------2. Charger une partie----------------------------------");
				System.out.println("--------0. Quitter---------------------------------------------");
				System.out.println("---------------------------------------------------------------");
				choix = IO.lireEntier();
				switch (choix) {
				case 1: {
					String s = "test";
					try {	
					int choix1;
					/*			*/
						Partie p1=new Partie();
						p1 = PartiePeer.retrieveByPK(s);
						Criteria crit = new Criteria();
						crit.add(PartiePeer.ID_PARTIE, s);
						SavePeer.doDelete(crit);
						PartiePeer.doDelete(crit);
						System.out.println("----------Partie test clean---------------");
						p1 = PartiePeer.retrieveByPK(s);
					}catch(NoRowsException e){
						System.out.println("--------veuillez donner un identifiant a la partie ------------");
						p.setIdPartie(IO.lireChaine());
						System.out.println("--------veuillez donner un libellé (de quoi s'en rappeler) a la partie ------------");
						p.setLibelle(IO.lireChaine());
						Save s1= new Save();
						Save s2= new Save();
						System.out.println("---------Choix ou création de l'echiquier----------------------");
						System.out.println("---------1. créer un nouvel échiquer---------------------------");
						System.out.println("---------2. retrouver un échiquer------------------------------");
						System.out.println("---------0. retour menu principal------------------------------");
						int choix1 = IO.lireEntier();
						switch (choix1) {
						case 1: {
							try {
								Echiquier e1 = EchiquierPeer.creerEchiquier();
								e1.addSave(s1);
								e1.addSave(s2);
								System.out.print("---------votre échiquier comporte ");
								System.out.print(e1.getCasees().size());System.out.println(" cases --------");
								trollManagement(p,s1,s2);
								s1.setPa(6);
								s2.setPa(6);
								s1.setIdPartie(p.getIdPartie());
								s2.setIdPartie(p.getIdPartie());
								s1.save();s2.save();p.addSave(s1);p.addSave(s2);
								lancerPartie(p);
							break;
							}
							catch (TorqueException e1) {
								e1.printStackTrace();
							} 
							catch (Exception e1) {
									// TODO Auto-generated catch block
							e1.printStackTrace();
							}
						}
						case 2: {
							Echiquier e1=new Echiquier();
							try{
								System.out.println("----voici tous les échiquier disponibles ---");
								Criteria crit = new Criteria();
								List<Echiquier> le = EchiquierPeer.doSelect(crit);
								if (le.size()==0){
									System.out.println(" ----- aucun echiquier n'a été enregistré dans le système----");
									System.out.println(" redirection vers la création d'échiquier ");
									e1 = EchiquierPeer.creerEchiquier();
								}
								else {
									boolean onatrouveunechiquier = false;
									do{
										for (int i=0;i<le.size();i++){
											System.out.println(le.get(i).getIdEchiquier());
										}
										System.out.println("--------veuillez donner un nom d'échiquier ----------");
										String idchoisi= IO.lireChaine();
										try{e1=EchiquierPeer.retrieveByPK(idchoisi);}
										catch (NoRowsException e11) {
											int a=1;
										}									
										onatrouveunechiquier=true;
									}while(!onatrouveunechiquier );
								}
							e1.addSave(s1);
							e1.addSave(s2);
							System.out.print("---------votre échiquier comporte ");
							System.out.print(e1.getCasees().size());System.out.println(" cases --------");
							s1.setPa(6);
							s2.setPa(6);
							s1.setIdPartie(p.getIdPartie());
							s2.setIdPartie(p.getIdPartie());
							trollManagement(p,s1,s2);
							s1.save();
							s2.save();
							p.addSave(s1);
							p.addSave(s2);
							trollManagement(p,s1,s2);
							lancerPartie(p);
							
							}
							catch (TorqueException e11) {
								e11.printStackTrace();
							} 
							catch (Exception e11) {
							e11.printStackTrace();
							}
							break;
						}
						default:
							break;
						}while (choix1!=0);
						break;
					}
					
				}
				case 2: {
					System.out.println("Donner un nom de partie");
					String Sp =IO.lireChaine();
					Boolean onaeuunbug = false;
					do {
					try {
						Partie p1 = PartiePeer.retrieveByPK(Sp);
						chargerPartie(p1.getIdPartie());
						}
						catch (NoRowsException e1) {
							System.out.println("aucune partie n'existe avec ce nom");
							onaeuunbug=true;
						}
					catch (TorqueException e) {
						// TODO: handle exception
						e.printStackTrace();
					}
					}while (onaeuunbug);
					//chargerPartie();
					break;
				}
				default:
					System.out.println("tape un chiffre donné, tu n'est pas aveugle alors lis !!");
					break;
				}
				
			}while (choix!=0);
		
		}
		catch (Exception e) {
			e.printStackTrace();
	}
	}





	private static void chargerPartie(String pa) {
		try {
			List<Save> partie1 =SavePeer.doSelectByID_partie(pa);
			System.out.println("les trolls participants à la partie sont :");	
			for (Save partie : partie1) {
				System.out.println(partie.getNomtroll());
				
			}
			lancerPartie(PartiePeer.retrieveByPK(pa));
		} catch (TorqueException e) {
			// TODO: handle exception
			e.printStackTrace();
		}
		
	}





	private static void afficher(Echiquier e) throws NoRowsException, TooManyRowsException, TorqueException {
		int x=e.getTaille();int y=e.getTaille();
		char [][] eq = new char[y][x];
		System.out.println();
		for (int z=0;z<x;z++){
			System.out.print(" _");
		}
		System.out.println();
		for (int d=0;d<y;d++){
			for (int a=0;a<x;a++){
				eq[d][a]='_';
				System.out.print("|"+eq[d][a]);
			}
			System.out.println("|");
		}
		System.out.println();
	}





	private static void trollManagement(Partie p, Save s1, Save s2) {
		try {	
				p.save();
				Date d = new Date();
				System.out.println("gestion du premier troll");
				Troll t1 = s1.getTroll();
				if (t1==null){
					t1=TrollPeer.TrollSelect();
				}else {
					t1.afficheCaracs();
				}
				s1.setTroll(t1);
				s1.setIdPartie(p.getIdPartie());
				s1.setNomtroll(t1.getNom());
				s1.setTimestamp(d);
				s1.save();t1.save();
				System.out.println("gestion du deuxieme troll");
				Troll t2 = s2.getTroll();
				if (t2==null){
					t2=TrollPeer.TrollSelect();
				}else {
					t2.afficheCaracs();
				}
				s2.setTroll(t2);
				s2.setTimestamp(d);
				s2.setIdPartie(p.getIdPartie());
				s2.setNomtroll(t2.getNom());
				s2.save();t2.save();
		}
		catch (TorqueException e) {
			e.printStackTrace();
		}catch (Exception e) {
			e.printStackTrace();
		}
	}

	private static void lancerPartie(Partie p) {
		List<Save> ls;
		try {
			ls = p.getSaves();
			Echiquier e = new Echiquier();
			for (int i=0;i<ls.size();i++){
				e = ls.get(i).getEchiquier();
				}
			afficher(e);
		} catch (TorqueException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
	}
	private void menuPartie(Partie p){
		List<Save> ls;
		Troll troll1= new Troll();
		Troll troll2= new Troll();
		Save save1 =new Save();
		Save save2 =new Save();
		int i=1;
		boolean partienonterminee=true;
		try {
			ls = p.getSaves();
			save1 = ls.get(1);
			troll1 = save1.getTroll();
			troll2 = ls.get(2).getTroll();
		}catch(Exception e){
			e.printStackTrace();
		}
		try{
		do{
		System.out.println("c'est au troll " + troll1.getNom() + " de jouer");
		listeActionsDispo(p,troll1,save1);
		System.out.println("c'est au troll " + troll2.getNom() + " de jouer");
		listeActionsDispo(p,troll2,save2);
		}while (i==1);
		}
		catch(ExceptionTroll1gagne e){
			
		}catch(ExceptionTroll2gagne e){
			
		}
	}






	private void listeActionsDispo(Partie p, Troll troll, Save s) throws ExceptionTroll1gagne,ExceptionTroll2gagne {
		final Scanner SCANNER = new Scanner(System.in);
		Echiquier e = s.getEchiquier();
		int consoDEPLA;
		boolean findutour=false;
		do{
		System.out.println("Et il vous reste : "+s.getPa()+" Points d'actions");
		System.out.println(" *****************************");
		System.out.println(" *Choisissez votre Action    *");
		System.out.println(" *****************************");
		System.out.println(" * 1- Deplacement            *");
		System.out.println(" * 2- Attaque                *");
		System.out.println(" * 3- Ramasser               *");
		System.out.println(" * 4- Utiliser               *");
		System.out.println(" * 5- Equiper                *");
		System.out.println(" * 6- Fin du tour            *");
		System.out.println(" * 7- Sauvegarder et quitter *");
		System.out.println(" *****************************");
		////////////////////////////////////////////////////
		System.out.println("Veuillez saisir un chiffre présent dans le menu:");
		int choix = SCANNER.nextInt();
		
		
		
		
		switch (choix)
		{
			//Deplacement
			case 1:
			{
				System.out.println("Votre position actuelle sur l'echequier de "+e.getTaille()+"*"+e.getTaille());
				List<Casee> lc= troll.getCasees();
				Casee c=  lc.get(1);
				int ptx=c.getX(),pty = c.getY();
					// pos sur le damier +1  pour l'affichage
					System.out.println(" en X :"+(ptx+1)+" en Y :"+(pty+1));
				
				System.out.println("Veuillez saisir la valeur en X puis Y de la futur position d�sirer (+1 en x ou +1 eny co�te 1 PA)"); 							
				System.out.println(" ");
				System.out.println("Veuillez saisir le nombre pour choisir la position en X :");
				int posX = SCANNER.nextInt();
				SCANNER.nextLine();
				System.out.println("Veuillez saisir le nombre pour choisir la position en Y :");
				int posY = SCANNER.nextInt();
				SCANNER.nextLine();
				// test si on se deplace sur l'autre troll
				Criteria crit = new Criteria();
				crit.add(PlacePeer.X, posX);
				crit.add(PlacePeer.Y, posY);
				String id = p.getIdPartie();
				crit.add(PlacePeer.ID_PARTIE, id);
				List<Place> lp;
				try{
					lp = PlacePeer.doSelect(crit);
				}catch(Exception e1){
					e1.printStackTrace();
				}
				if (!lp.isEmpty())
				{
					System.out.println("Vous ne pouvez pas vous deplacer en "+posX+" , "+posY+" car un autre joueur est positione a cette endroit !");
				}
				// 
				else if (Math.abs(ptx - posX) + Math.abs(pty - posY) <= s.getPa())
				{
					//mise a jour des Pa
					s.setPa(s.getPa() -(Math.abs(ptx - posX) + Math.abs(pty - posY))*consoDEPLA);
					if (Destin()){
						
					}
					
					System.out.println("Votre nouvelle position :");												
					// mise a jour dans la BD des positions
					
					// effacement sur la map :
					map[ptx-1][pty-1] = 0; 			
				}
				else
				{
					System.out.println("!!! Vous n'avez pas assez de PA pour ce mouvement");
				}
			}// END OF CASE 1 DEPLACER
			break;
			// Attaquer
			case 2:
			{
				int atack = 0, def = 0 ;
				if(akiletour==0)
				{
					 px = posXtroll1;
					 py = posYtroll1;
					 atack = 0;
					 def = 1;
				}
				else if ( akiletour == 1)
				{
					 px = posXtroll2;
					 py = posYtroll2; 
					 atack = 1;
					 def=0;
				}
				// tester si un enemi a porter
				// TODO prendre en compte l'exception d'un objet
				if (map[py-1][px] != 0 || map[py][px-1] != 0 || map[px+1][py+1] != 0 || map[py+1][py] != 0 || map[py][px+1] != 0 || map[px+1][py-1] != 0 || map[py][px-1] != 0  || map[py-1][px-1] != 0   )
				{
					PA = PA - consoATQ;
					int degatot = 0 ;
					px=0; py=0;
					
					int dés1 = ( (int)(Math.random() * ((3+1)-1)) + 1 ) ;
							
					int dés2 = ( (int)(Math.random() * ((3+1)-1)) + 1 ) ;
					
					if (carac[atack][1] * dés1 >= carac[def][2] * dés2)
					{
						System.out.println("Coup reussi");
					}
					else if (carac[atack][1] * dés1 > carac[def][2] * dés2)
					{
						System.out.println("Coup rate");
					}								
					int dés = ( (int)(Math.random() * ((3+1)-1)) + 1 ) ;
					degatot = dés *  carac[atack][2] ;	
					map [3][3] = 3 ;		carac[def][3] = carac[def][3] - degatot ;							
					System.out.println(" le troll : " +tabnom[def]+ " a subit un total  de : " +degatot+ " de degat");
				}
				else
				{							
					System.out.println(" Il n'y a personne a distance d'attaque");
				}
				
				if (carac[def][3] <= 0)
				{
					finpartie = true;
					System.out.println(" Partie fini");
				}						
				// TODO sauvegarder dans la base dans TORQUE
			}// END OF CASE 2 ATAK
			break;
			// Ramasser
			case 3:
			{
				px=0; py=0;
				if(akiletour==0)
				{
					 px = posXtroll1;
					 py = posYtroll1;
				}
				else if ( akiletour == 1)
				{
					 px = posXtroll2;
					 py = posYtroll2; 
				}
				// tester si un enemi a porter
				// TODO prendre en compte l'exception d'un objet
				if (map[py-1][px] != 3 || map[py][px-1] != 3 || map[px+1][py+1] != 3 || map[py+1][py] != 3 || map[py][px+1] != 3 || map[px+1][py-1] != 0 || map[py][px-1] != 3  || map[py-1][px-1] != 3   )
				{
					
				}
				else
				{
					System.out.println("");
				}
			} // END OF CASE 3 RAMASSER
			break;	
			// Utiliser
			case 4:
				InventairePeer.consultInv(numpartie, tabnom[akiletour]);
			break;
			
			// Equiper
			case 5:
				
			break;
			
			// Fin du tour
			case 6:
				
				System.out.println("Vous finissez votre tour");
				
				if(akiletour == 0)
				{
					akiletour = 1;
				}
				else
				{
					akiletour = 0;
				}
				// TODO REGLER PROBLEME QUE LE TOUR NE SE PASSE PAS.
				PA = 0;
				
			break;
			
			// Sauvegarder et quitter
			case 7:
				
			break;
		  default:
		    System.out.println("courage");
		}// END of SWITCH
		
		if (PA == 0 )
		{
			if(akiletour == 0)
			{
				akiletour = 1;
			}
			else
			{
				akiletour = 0;
			}
		}
	}			
		
		
		
		}while(!findutour | s.getPa()>0);
	}

}